#include <sstream>
#include <string>
#include <set>
#include <vector>
#include <map>

#include <iostream>

#include "types.h"

// Совсем глупый морфологический анализ: смотрит на последнюю букву и делает
// странные предположения
class CStupidMorphology : public IMorphology {
public:

  virtual std::vector<morph> Analyze(const std::string &s, const std::vector<span> &t) const {
    std::vector<morph> v;

    for (size_t i = 0; i < t.size(); i++) {
      std::string word = s.substr(t[i].pos, t[i].len);
      v.push_back(Lookup(word));
    }

    return v;
  }

  virtual morph Lookup(const std::string &s) const {
    morph m;
    if (s.length() > 2 && "а" == s.substr(s.length() - 2, 2)) {
      m = morph(s, "NOUN femn sing nomn anim");
    }
    return m;
  }

}; 

// Словарная морфология
class CDictMorphology : public IMorphology {
public:
  CDictMorphology() {
    Load();
  }

  ~CDictMorphology() {
    // TODO: удалить динамические структуры данных, использованные для словаря
  }

  virtual std::vector<morph> Analyze(const std::string &s, const std::vector<span> &t) const {
    std::vector<morph> v;
    // TODO: сделать морфологический разбор по словарю
    return v;
  }

protected:
  void Load() {
    // TODO: загрузить словарь
  }
};

// Предиктивная морфология
class CPredictiveMorphology : public IMorphology {
public:

  virtual std::vector<morph> Analyze(const std::string &s, const std::vector<span> &t) const {
    std::vector<morph> v;
    // TODO: сделать морфологический разбор без словаря для незнакомых слов
    return v;
  }
};

